home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 147 / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin / docs / ippon / data / etc / lboss01.lzh / main.c < prev    next >
C/C++ Source or Header  |  1999-04-21  |  5KB  |  252 lines

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <XSP2lib.H>
  5. #include <pcm8afnc.h>
  6. #include <sys/dos.h>
  7. #include <sys/iocs.h>
  8. #include "main.h"
  9. #include "fxsp2lib.h"
  10.  
  11.  
  12. #define    PCG_MAX    1024        /* スプライトPCGパターン最大使用数 */
  13. #define    REF_MAX    1024        /* 複合スプライトリファレンスデータ最大使用数 */
  14. #define    FRM_MAX    1024        /* 複合スプライトフレームデータ最大使用数 */
  15. #define RGB(r,g,b) ((g)<<11|(r)<<6|(b)<<1)
  16.  
  17. static char pcg_alt[PCG_MAX + 1];    /* PCG配置管理テーブル */
  18. static char pcg_dat[PCG_MAX * 128];    /* PCGデータファイル読み込みバッファ */
  19. static XOBJ_FRM_DAT frm_dat[FRM_MAX];    /* フレームデータ */
  20. static XOBJ_REF_DAT ref_dat[REF_MAX];    /* リファレンスデータ */
  21. static int old_crtmod;
  22.  
  23. char f_option_flag = 0;
  24. char end_of_data = 0;
  25.  
  26.  
  27.  
  28. void usage (void)
  29. {
  30.     printf ("中ボステストパターン表示&作成 main.x ver0.01\n"
  31.         "        programmed by Mitsuky <FreeSoftware>\n"
  32.     );
  33. }
  34.  
  35. /* 起動時のファイル読み込み */
  36. /* 読み込みに失敗した場合はいきなり終了するので注意 */
  37. int load_file (char *fname, void *ptr, size_t size, size_t n)
  38. {
  39.     FILE *fp;
  40.     int i;
  41.  
  42.     if ((fp = fopen (fname, "rb")) == NULL) {
  43.         //fatal_error (ERROR_FILE, fname);
  44.         printf ("%s が読めません\n", fname);
  45.     }
  46.     i = fread (ptr, size, n, fp);
  47.     fclose (fp);
  48.  
  49.     return (i);        /* 返り値は読み込みバイト数 */
  50. }
  51.  
  52.  
  53. void wait_vdisp (void)
  54. {
  55.     int sp;
  56.     sp = _iocs_b_super (0);
  57.     while ((*(volatile unsigned char *) 0xe88001) & 0x10 == 0);
  58.     while ((*(volatile unsigned char *) 0xe88001) & 0x10);
  59.     _iocs_b_super (sp);
  60. }
  61.  
  62.  
  63.  
  64. void init (void)
  65. {
  66.     int i, sp;
  67.     unsigned short *s, *d;
  68.     unsigned short pal_dat[16 * 15];    /* パレットデータファイル読み込みバッファ */
  69.     int sizeof_ref;        /* 複合スプライトリファレンスデータ読み込み数 */
  70.     unsigned short crtcdata[9] =
  71.     {69, 6, 11 + 8, 59 - 8, 567, 5, 40, 552, 785};
  72.     unsigned short textpalet[16] =
  73.     {0, RGB (16, 16, 20), RGB (12, 12, 20), RGB (28, 28, 31), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
  74.  
  75.     old_crtmod = _iocs_crtmod (-1);
  76.     _iocs_b_curoff ();
  77.     wait_vdisp ();
  78.     _iocs_crtmod (14);    /* 256*256dot 31kHz 65536色 */
  79.     _iocs_g_clr_on ();
  80.     _iocs_b_curoff ();
  81.     _iocs_ms_curof ();
  82.     _iocs_skey_mod (0, 0, 0);
  83.  
  84.     //sp = _iocs_b_super (0);
  85.     //*(unsigned short *) 0xe82600 &= 0xff80;    /* 画面表示全オフ */
  86.     //_iocs_b_super (sp);
  87.  
  88.  
  89.     _iocs_sp_init ();
  90.     _iocs_sp_on ();        /* スプライト表示をON */
  91.     _iocs_bgctrlst (0, 0, 0);    /* BG0表示OFF */
  92.     _iocs_bgctrlst (1, 1, 0);    /* BG1表示OFF */
  93.  
  94.  
  95.     /* 256x256 正方形モードを作る */
  96.     sp = _iocs_b_super (0);
  97.     *(unsigned short *) 0xe80028 = crtcdata[8];
  98.     d = (unsigned short *) 0xe80002;
  99.     for (i = 1; i < 8; i++)
  100.         *d++ = crtcdata[i];
  101.     *(unsigned short *) 0xe80000 = crtcdata[0];
  102.  
  103.     *(unsigned short *) 0xe8e006 |= 0b10;    /* HRL ビット */
  104.     *(unsigned short *) 0xeb080c = crtcdata[2] + 4;
  105.     *(unsigned short *) 0xeb080a = crtcdata[0];    /* スプライト */
  106.     *(unsigned short *) 0xeb080e = crtcdata[6];
  107.  
  108.     *(unsigned short *) 0xe82500 = 0b01001001001110;    /* 優先順位 TX>SP>GR */
  109.     _iocs_b_super (sp);
  110.  
  111.     load_file ("LBOSS01.SP", pcg_dat, sizeof (char), 128 * PCG_MAX);
  112.     load_file ("otoko.PAL", pal_dat, 2, 16 * 15);
  113.  
  114.     /* パレットに転送 */
  115.     sp = _iocs_b_super (0);
  116.     s = (unsigned short *) 0xe82200;
  117.     for (i = 0; i < 16; i++)
  118.         *s++ = textpalet[i];
  119.     d = pal_dat;
  120.     for (i = 0; i < 15 * 16; i++)
  121.         *s++ = *d++;
  122.     _iocs_b_super (sp);
  123.  
  124.     {
  125.         struct _lineptr lp;
  126.         lp.x1 = 0;
  127.         lp.y1 = 128;
  128.         lp.x2 = 255;
  129.         lp.y2 = 128;
  130.         lp.color = 0xf800;
  131.         lp.linestyle = 0xaaaa;
  132.         _iocs_line (&lp);
  133.         lp.x1 = 128;
  134.         lp.y1 = 0;
  135.         lp.x2 = 128;
  136.         lp.y2 = 255;
  137.         _iocs_line (&lp);
  138.     }
  139.     seq_init0 ();
  140.     EnemyInit0 ();
  141.  
  142.     _dos_breakck (2);    /* BREAK チェックを殺す */
  143.  
  144.     if (f_option_flag)
  145.         fxsp_on ();
  146.     xsp_on ();
  147.     xsp_mode (2);
  148.     xsp_pcgdat_set (pcg_dat, pcg_alt, sizeof (pcg_alt));
  149.     //xsp_objdat_set (ref_dat);
  150.     //pcm8a_vsyncint_on ();
  151.  
  152.     //sp = _iocs_b_super (0);
  153.     //*(unsigned short *) 0xe82600 |= 0x007f;    /* 画面表示オン */
  154.     //_iocs_b_super (sp);
  155. }
  156.  
  157.  
  158. int tini (void)
  159. {
  160.     int sp;
  161.  
  162.     //pcm8a_vsyncint_off ();
  163.     xsp_off ();
  164.     if (f_option_flag)
  165.         fxsp_off ();
  166.  
  167.     EnemyTini ();
  168.     wait_vdisp ();
  169.  
  170.     sp = _iocs_b_super (0);
  171.     *(unsigned short *) 0xe8e006 &= 0xfffd;    /* HRL ビット */
  172.     _iocs_b_super (sp);
  173.  
  174.     _iocs_skey_mod (-1, 0, 0);
  175.     _iocs_b_curon ();
  176.     _iocs_crtmod (old_crtmod);
  177.  
  178.     return (0);
  179. }
  180.  
  181.  
  182.  
  183. void game (void)
  184. {
  185.     seq_init ();
  186.  
  187.     for (;;) {
  188.         do {
  189.             seq_move ();
  190.             EnemyMove ();
  191.             xsp_out ();
  192.             if (f_option_flag)
  193.                 fxsp_out ();
  194.             if (f_option_flag && end_of_data)
  195.                 break;
  196.         } while ((_iocs_ms_getdt ()& 0xffff) == 0);
  197.         if (f_option_flag || (_iocs_ms_getdt ()& 0x00ff))
  198.             break;
  199.         EnemyTini ();
  200.         seq_init ();
  201.     }
  202. }
  203.  
  204.  
  205.  
  206. int main (int argc, char *argv[])
  207. {
  208.     int i;
  209.     int slash_flag = 0;
  210.     int fname_found_flag = 0;    /* ファイル名が1つでもあったか */
  211.  
  212.     {
  213.         char *temp;
  214.  
  215.         temp = getenv ("SLASH");
  216.         if ((temp != NULL) && (*temp == '/')) {
  217.             slash_flag = 1;
  218.         }
  219.     }
  220.  
  221.     for (i = 1; i < argc; i++) {
  222.         if (('-' == *argv[i]) || ((slash_flag == 0) && ('/' == *argv[i]))) {
  223.             switch (*(argv[i] + 1)) {
  224.  
  225.             case 'f':
  226.             case 'F':
  227.                 f_option_flag = !0;
  228.                 break;
  229.  
  230.             default:
  231.                 usage ();
  232.                 return (-1);
  233.             }
  234.         } else {
  235.             fname_found_flag = 1;
  236.         }
  237.     }
  238.  
  239. #if    0
  240.     if (fname_found_flag == 0) {
  241.         usage ();
  242.         return (-1);
  243.     }
  244. #endif
  245.     init ();
  246.     game ();
  247.  
  248.     tini ();
  249.  
  250.     return (0);
  251. }
  252.